﻿using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Input;

namespace Black.Minecraft.Editor.ViewModels.Core
{
    /// <summary>
    /// Base servant à chaque ViewModel
    /// </summary>
    public abstract class BaseViewModel : INotifyPropertyChanged
    {
        #region Evénements

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

        #region Propriétés

        /// <summary>
        /// Obtient ou définit si on est en attente
        /// </summary>
        public bool IsLoading
        {
            get
            {
                return (this._isLoading);
            }
            set
            {
                if (this._isLoading != value)
                {
                    this._isLoading = value;
                    this.OnPropertyChanged();
                }
            }
        }

        /// <summary>
        /// Obtient la commande de fin de chargement
        /// </summary>
        public ICommand LoadedCommand
        {
            get
            {
                return (this._loadedCommand);
            }
        }

        #endregion

        #region Variables d'instances

        private bool _isLoading;
        private RelayCommand _loadedCommand;

        #endregion

        #region Constructeurs

        /// <summary>
        /// Constructeur de la classe
        /// </summary>
        public BaseViewModel()
        {
            this._isLoading = false;
            this._loadedCommand = new RelayCommand(this.OnLoadedCommandExecute);

            this.OnInitializeCommand();
        }

        #endregion

        #region Fonctions publiques

        /// <summary>
        /// Recharche la zone
        /// </summary>
        public virtual void Reload()
        {
        }

        #endregion

        #region Fonctions protégées

        /// <summary>
        /// Lance l'initialisation des commandes
        /// </summary>
        protected virtual void OnInitializeCommand()
        {
        }

        /// <summary>
        /// Se produit sur l'éxécution de la commande de chargement
        /// </summary>
        /// <param name="parameter">Paramètre de la commande</param>
        protected virtual void OnLoadedCommandExecute(object parameter)
        {
        }

        /// <summary>
        /// Notiie d'un changement de propriété
        /// </summary>
        /// <param name="name">Nom de la propriété</param>
        protected void OnPropertyChanged([CallerMemberName] string name = null)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(name));
        }

        #endregion
    }
}
